package peace.design.command
{

import flash.events.Event;
	
/**
 * команда для последовательного выполнения группы команд
 */	
public class QueueCommand extends Command
{
	/**
	 * Очередь команд
	 */	
	public var queue:Array = [];
	/**
	 * Выполняемая команда
	 */	
	public var runningCommand:Command = null;
	
	/**
	 * @param commands одна или несколько команд-параметров
	 */	
	public function QueueCommand (...commands)
	{
		if (commands.length > 0)
		{
			if (commands[0] is Array)
			{
				this.queue = commands[0] as Array;				
			}
			else
			{
				for each (var c:Command in commands)
				{
					queue.push(c);
				}
			}
		}
	}
	
	override public function execute ():void
	{
		super.execute();
		executeNextCommand();
	}


	protected function executeNextCommand ():void
	{
		// если запущенной команды нет, то запускаем первую
		// если есть - следующую
		var index:int = (runningCommand) ? queue.indexOf(runningCommand) : -1;
		
		if (index < queue.length-1)
		{
			var c:Command = Command (queue[index+1]);
			runningCommand = c;
			c.addEventListener(Event.COMPLETE, onCommandComplete, false,0,true);
			c.execute();
		}
		else
		{
			runningCommand = null;
			notifyComplete();
		}
	}
	
	protected function onCommandComplete (e:Event):void
	{
		runningCommand.removeEventListener(Event.COMPLETE, onCommandComplete);
		
		executeNextCommand();
	}
	
}
}